<?php

	require_once CORMO_DIR_CORE.'Schema.class.php';

	/**
	 * Base del Scaffolding.
	 * Representa un Objeto que puede ser Persistido, almacenado en una Tabla de Base de datos.
	 *
   * @category cormo
   * @package Generator
   * @author Germán Dario Peraferrer <gperaferrer@gmail.com>
   * @copyright Copyright (c) 2007 Germán Dario Peraferrer - Beetec
   * @version 1.0 Beta
   * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
   * @link http://code.google.com/p/cormoframework/
   * @link http://www.beetec.com.ar
	 */

	class Object extends Schema {

       	public function __construct($nameObjectORM) {
        	parent::__construct($nameObjectORM);
        }

       /**
    	* Obtenemos un Array con los campos que son Key de la Tabla.
    	*
    	* @return array
    	*/
       	public function getConfigKeys()  {
        	 return array(parent::getConfigData("Key"));
        }

       /**
	    * Nos Devuelve la Primer o uno Key de la Tabla
        *
    	* @return array
	    */
        public function getConfigKey()  {
            return parent::getConfigData("Key");
        }

	  /**
       * Obtenemos los campos que se han especificado en la configuracion, como atributos
       * del objeto que seran persistidos.
	   *
       * @return array
       */
	   public function getConfigFields()  {
           return parent::getConfigData("Fields");
	   }

      /**
       * Retorna los Fields que no son Key de Tabla, esto es util a la hora de tener
	   * que formar los SQL para INSERT y UPDATE. Es solo de usao interno.
       *
       * @return array
	   */
       public function getConfigFieldsNotKey()  {
           return array_diff($this->getConfigFields(), $this->getConfigKeys());
	   }

	  /**
       * Obtenemos el nombre de la Tabla que esta representando el Objeto que nos ha heredado.
       *
	   * @return string
       */
	   public function getConfigTableName() {
           return parent::getConfigData("TableName");
	   }

      /**
       * Obtenemos el nombre del Objeto que va a representar.
	   *
       * @return string
       */
	   public function getConfigObjectName() {
           return parent::getConfigData("ObjectName");
	   }

      /**
       * Obtenemos el array con las Tablas Asociadas
	   *
       * @return array
       */
	   public function getConfigTableAssociate() {
           return parent::getConfigData("TableAssociate");
	   }

	  /**
       * Obtenemos los valores Default de los campos en los cuales es necesario,
       * estos datos estan en schema.php
	   *
       * @return array
       */
	   public function getConfigDefaultValues($property = null) {
           if (is_null($property)) {
               return parent::getConfigData("DefaultValues");
           } else {
               // Retorna solo el property especificado como parametro
               $arr = parent::getConfigData("DefaultValues");
               return @$arr[$property];
           }
       }

       /**
        * Obtenemos las Funciones SQL que se han definido para cada campo de la tabla, las mismas
        * serán reemplazadas en las Consultas SQL que se generen para determinar el formato de la
        * información a obtener del campo especificado.
        *
        * @return array
        */
	   public function getFunctionsSQL() {
           return parent::getConfigData("FunctionsSQL");
	   }

	  /**
       * Obtenemos las Properties que no seran tenidas en cuenta a la hora de
       * realizar comparaciones de Objetos mediante el metodo Exists.
	   *
       * @return array
       */
	   public function getPropertyNotCompare()	{
           return parent::getConfigData("PropertyNotCompare");
	   }

	  /**
       * Obtenemos las Properties que se deberan utilizar para relaizar la
       * comparacion de Objetos Persistidos, de esta manera se podra personalizar
	   * el metodo Exists directamente desde la configuracion del ORM.
       *
       * @return array
	   */
       public function getPropertyCompare()	{
           return @array_diff($this->getConfigFieldsNotKey(), $this->getPropertyNotCompare());
	   }

      /**
       * Obtiene el nombre de la conexión que debe utilizar para persistir objetos.
	   *
       * @return string
       */
	   public function getConnection()	{
           return parent::getConfigData("Connection");
	   }

	  /**
       * Verifica si todos los datos del Array de Configuracion han sido completados.
       *
	   * @return bool
       */
	   public function isConfigValid()  {
           if( ($this->getConfigFields() !== null ) &&
               ($this->getConfigTableName() !== null ) &&
               ($this->getConfigKeys() !== null )) {
               return true;
           } else {
        	   return false;
           }
       }

      /**
       * Obtiene todos los objetos que poseen relaciones hacia otros
       *
       * @return array
       */
       public function getORMTableAssociate() {
           global $CORMO;
           $arrObjects = array();
           // Recorremos la configuracion para determinar los objetos a crear
           foreach($CORMO as $object => $cfg)	{
               // Filtramos solos los Array que representan Object / Table
               if (substr($object, 0, 4) === 'orm_') {
                   // Filtramos solo los objetos que poseen relaciones
                   if (count($cfg["TableAssociate"]) > 0) {
                       $arrObjects[$cfg["ObjectName"]] = $cfg["TableAssociate"];
                   }
               }
			}
			return $arrObjects;

		}

	}

?>